/**
 * 管理人员子类：继承Employee，按“底薪 + 绩效奖金”计薪
 */
public class Manager extends Employee {
    // 管理人员特有属性：底薪、绩效奖金
    private final double baseSalary;  // 月底薪
    private final double bonus;       // 绩效奖金

    // 构造方法：初始化公共属性+特有属性
    public Manager(String id, String name, String month, double baseSalary, double bonus) {
        super(id, name, month);
        this.baseSalary = baseSalary;
        this.bonus = bonus;
    }

    /**
     * 重写薪资计算方法：管理人员薪资 = 底薪 + 绩效奖金
     * 异常处理：底薪、奖金为负
     */
    @Override
    public double calculateSalary() throws NegativeSalaryException {
        // 校验底薪和奖金是否为负（触发薪资为负异常）
        if (baseSalary < 0) {
            throw new NegativeSalaryException("管理人员[" + name + "]底薪非法：" + baseSalary + "元（不能为负）");
        }
        if (bonus < 0) {
            throw new NegativeSalaryException("管理人员[" + name + "]绩效奖金非法：" + bonus + "元（不能为负）");
        }
        // 合法则计算薪资
        return baseSalary + bonus;
    }

    /**
     * 重写工资条生成方法：用String拼接薪资明细（符合文档1-58要求）
     */
    @Override
    public String generateSalarySlip() throws NegativeSalaryException {
        double totalSalary = calculateSalary(); // 先计算薪资（触发异常则中断生成）
        // String格式化拼接工资条，与普通员工格式统一
        return "===================== 管理人员工资条 =====================\n" +
                String.format("工号：%s\t姓名：%s\t计算月份：%s\n", id, name, month) +
                "-----------------------------------------------------\n" +
                String.format("薪资构成：底薪（%.2f元） + 绩效奖金（%.2f元）\n", baseSalary, bonus) +
                "-----------------------------------------------------\n" +
                String.format("本月实发薪资：%.2f元\n", totalSalary) +
                "=====================================================\n\n";
    }

}
